//
// Created by yonghu0 on 25-10-9.
//

#include <functional> //greater的头文件
#include <iostream>
#include <map>	   //multimap的头文件
#include <utility> //pair的头文件

void
print(std::multimap<int, int> &my_multimap)
{
    for (auto &elem: my_multimap)
    {
        std::cout << elem.first << " " << elem.second << std::endl;
    }
}

int
main()
{
    std::cout << "multimap_test begin" << std::endl;

    std::cout << "--------------创建multimap----------------" << std::endl;
    // 创建递增排序的multimap
    std::multimap<int, int> my_multimap1;
    // 创建递减排序的multimap
    std::multimap<int, std::greater<int> > my_multimap3;

    std::cout << "----------------容器size--------------" << std::endl;
    std::cout << my_multimap1.size() << std::endl;
    std::cout << "----------------容器判空---------------" << std::endl;
    std::cout << my_multimap1.empty() << std::endl;

    std::cout << "----------插入元素--------------------" << std::endl;
    // 插入单个元素
    // 不能用下标操作，例如my_multimap1[1]=11;
    // 因为multimap有重复元素，my_multimap1[1]不知指哪个元素
    my_multimap1.insert(std::pair<int, int>(1, 11));
    my_multimap1.insert(std::pair<int, int>(2, 22));
    my_multimap1.insert(std::pair<int, int>(3, 33));
    my_multimap1.insert(std::pair<int, int>(4, 44));
    my_multimap1.insert(std::pair<int, int>(5, 55));
    print(my_multimap1);
    my_multimap1.insert(std::pair<int, int>(5, 555)); // 插入重复元素
    print(my_multimap1);
    // 插入区间

    std::cout << "------------查找元素(判断元素是否在容器中)-----------"
            << std::endl;
    // 方法一
    if (my_multimap1.find(5) != my_multimap1.end())
    {
        std::cout << "元素在multimap中" << std::endl;
    } else
    {
        std::cout << "元素不在multimap中" << std::endl;
    }
    // 方法二
    if (my_multimap1.count(5))
    {
        std::cout << "元素在multimap中" << std::endl;
    } else
    {
        std::cout << "元素不在multimap中" << std::endl;
    }

    std::cout << "------------修改multimap中的元素--------------" << std::endl;
    // 通过迭代器修改元素的value
    // 修改所有key为5的值，其value为99
    auto f_pair = my_multimap1.equal_range(5);
    for (auto it = f_pair.first; it != f_pair.second; it++)
    {
        it->second = 99;
    }
    print(my_multimap1);
    std::cout << "------------删除元素-----------------------------" << std::endl;
    // 删除单个元素
    // 方法一
    my_multimap1.erase(5);
    print(my_multimap1);
    my_multimap1.erase(11); // 删除不存在的元素，不报错
    print(my_multimap1);
    // 方法二
    my_multimap1.erase(my_multimap1.begin());
    print(my_multimap1);
    // 删除区间
    // 用的不多，这里就不列举

    std::cout << "----其他用法(lower_bound/upper_bound/equal_range)-----"
            << std::endl;
    // lower_bound/upper_bound/equal_range方法
    std::multimap<int, int>::iterator it_low_bound = my_multimap1.lower_bound(3);
    std::cout << it_low_bound->first << " " << it_low_bound->second << std::endl;
    std::multimap<int, int>::iterator it_upper_bound
            = my_multimap1.upper_bound(3);
    std::cout << it_upper_bound->first << " " << it_upper_bound->second
            << std::endl;
    std::pair<std::multimap<int, int>::iterator,
                std::multimap<int, int>::iterator>
            p_equal_range;
    p_equal_range = my_multimap1.equal_range(3);
    std::cout << (p_equal_range.first)->first << " "
            << (p_equal_range.first)->second << std::endl;
    std::cout << (p_equal_range.second)->first << " "
            << (p_equal_range.second)->second << std::endl;

    std::cout << "------------清空容器-----------------" << std::endl;
    my_multimap1.clear();
    print(my_multimap1);

    std::cout << "multimap_test end" << std::endl;
    return 0;
}
